# seuOS for Cortex-M4

# asm section
# ;向内函数声明(指明该函数体在外部)

	.extern    seu_tcb_cur           
    .extern    seu_tcb_rdy        
# ;向外函数声明(指明该函数体在此处)
    .global    PORT_seu_core_enter     
    .global    PORT_seu_core_exit    
    .global	   PORT_seu_psp_reset	
	.global    PendSV_Handler		
     	
    .cpu cortex-m4
	.syntax unified
	.thumb
	.text
# ;关全局中断
.type PORT_seu_core_enter, %function
PORT_seu_core_enter:
    cpsid    I                
    bx    lr   

# ;开全局中断
.type PORT_seu_core_exit, %function
PORT_seu_core_exit:
    cpsie    I                
    bx    lr   
# ;堆栈指针清0
.type PORT_seu_psp_reset, %function
PORT_seu_psp_reset:
    cpsid    I                
    ldr r4,=0x0                       
    msr     psp, r4              
    cpsie    I                
    bx    lr
#  ;软件触发中断函数(只要是能软件触发的中断都可以，中断触发中断:SV中断) 
.type PendSV_Handler, %function
PendSV_Handler:
    cpsid    I                
    mrs     r0, psp              	
    cbz     r0, seu_reset_enter 

#	;FPU support code
    subs    R0, R0, #0X40 
    vstm    R0, {S16-S31}	
#   ;FPU support code
	
    sub     r0, r0, #0x20  	  
    stm     r0, {r4-r11}      
    ldr     r1, =seu_tcb_cur   							  
    ldr     r1, [r1]          
    str     r0, [r1] 

.type seu_reset_enter, %function
seu_reset_enter:
    ldr     r0, =seu_tcb_cur   
    ldr     r1, =seu_tcb_rdy
    ldr     r2 , [r1]         
    str     r2 , [r0]         
    ldr     r0 , [r2]         
	ldm     r0, {r4-r11}       
	add     r0, r0, #0x20 

#   ;FPU support code
    vldm    R0, {S16-S31} 
    adds    R0, R0, #0X40
#   ;FPU support code
	
    msr     psp, r0            
    orr     lr, lr, #0x04      
    cpsie     I                
    bx    lr   
	
   .align 4                    
   .end                        
#   ;by Angle_145    
	
#	;说明：PendSV：可悬挂软件触发中断，能避免和其他中断产生冲突，而其他非Pend的SV中断，
#	;软件触发中断前需要检查当前mcu是否处在中断状态,只有在非中断状态下才能触发软件中断。
#   ;原因：在其他中断状态下强制触发软件中断会发生HardFault中断。	
